{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "\n",
    "import logging\n",
    "import numpy as np\n",
    "from optparse import OptionParser\n",
    "import sys\n",
    "from time import time\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.datasets import fetch_20newsgroups\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.feature_extraction.text import HashingVectorizer\n",
    "from sklearn.feature_selection import SelectFromModel\n",
    "from sklearn.feature_selection import SelectKBest, chi2\n",
    "from sklearn.linear_model import RidgeClassifier\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "from sklearn.linear_model import Perceptron\n",
    "from sklearn.linear_model import PassiveAggressiveClassifier\n",
    "from sklearn.naive_bayes import BernoulliNB, MultinomialNB\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.neighbors import NearestCentroid\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.utils.extmath import density\n",
    "from sklearn import metrics\n",
    "\n",
    "# Display progress logs on stdout\n",
    "logging.basicConfig(level=logging.INFO,\n",
    "                    format='%(asctime)s %(levelname)s %(message)s')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Option at 0x1fa45a66d30: --filtered>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# parse commandline arguments\n",
    "op = OptionParser()\n",
    "op.add_option(\"--report\",\n",
    "              action=\"store_true\", dest=\"print_report\",\n",
    "              help=\"Print a detailed classification report.\")\n",
    "op.add_option(\"--chi2_select\",\n",
    "              action=\"store\", type=\"int\", dest=\"select_chi2\",\n",
    "              help=\"Select some number of features using a chi-squared test\")\n",
    "op.add_option(\"--confusion_matrix\",\n",
    "              action=\"store_true\", dest=\"print_cm\",\n",
    "              help=\"Print the confusion matrix.\")\n",
    "op.add_option(\"--top10\",\n",
    "              action=\"store_true\", dest=\"print_top10\",\n",
    "              help=\"Print ten most discriminative terms per class\"\n",
    "                   \" for every classifier.\")\n",
    "op.add_option(\"--all_categories\",\n",
    "              action=\"store_true\", dest=\"all_categories\",\n",
    "              help=\"Whether to use all categories or not.\")\n",
    "op.add_option(\"--use_hashing\",\n",
    "              action=\"store_true\",\n",
    "              help=\"Use a hashing vectorizer.\")\n",
    "op.add_option(\"--n_features\",\n",
    "              action=\"store\", type=int, default=2 ** 16,\n",
    "              help=\"n_features when using the hashing vectorizer.\")\n",
    "op.add_option(\"--filtered\",\n",
    "              action=\"store_true\",\n",
    "              help=\"Remove newsgroup information that is easily overfit: \"\n",
    "                   \"headers, signatures, and quoting.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Automatically created module for IPython interactive environment\n",
      "Usage: __main__.py [options]\n",
      "\n",
      "Options:\n",
      "  -h, --help            show this help message and exit\n",
      "  --report              Print a detailed classification report.\n",
      "  --chi2_select=SELECT_CHI2\n",
      "                        Select some number of features using a chi-squared\n",
      "                        test\n",
      "  --confusion_matrix    Print the confusion matrix.\n",
      "  --top10               Print ten most discriminative terms per class for\n",
      "                        every classifier.\n",
      "  --all_categories      Whether to use all categories or not.\n",
      "  --use_hashing         Use a hashing vectorizer.\n",
      "  --n_features=N_FEATURES\n",
      "                        n_features when using the hashing vectorizer.\n",
      "  --filtered            Remove newsgroup information that is easily overfit:\n",
      "                        headers, signatures, and quoting.\n"
     ]
    }
   ],
   "source": [
    "def is_interactive():\n",
    "    return not hasattr(sys.modules['__main__'], '__file__')\n",
    "\n",
    "# work-around for Jupyter notebook and IPython console\n",
    "argv = [] if is_interactive() else sys.argv[1:]\n",
    "(opts, args) = op.parse_args(argv)\n",
    "if len(args) > 0:\n",
    "    op.error(\"this script takes no arguments.\")\n",
    "    sys.exit(1)\n",
    "\n",
    "print(__doc__)\n",
    "op.print_help()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "if opts.all_categories:\n",
    "    categories = None\n",
    "else:\n",
    "    categories = [\n",
    "        'alt.atheism',\n",
    "        'talk.religion.misc',\n",
    "        'comp.graphics',\n",
    "        'sci.space',\n",
    "    ]\n",
    "    \n",
    "    \n",
    "if opts.filtered:\n",
    "    remove = ('headers', 'footers', 'quotes')\n",
    "else:\n",
    "    remove = ()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading 20 newsgroups dataset for categories:\n",
      "['alt.atheism', 'talk.religion.misc', 'comp.graphics', 'sci.space']\n"
     ]
    }
   ],
   "source": [
    "print(\"Loading 20 newsgroups dataset for categories:\")\n",
    "print(categories if categories else \"all\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2018-02-22 21:19:45,766 INFO Downloading 20news dataset. This may take a few minutes.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data loaded\n"
     ]
    }
   ],
   "source": [
    "data_train = fetch_20newsgroups(subset='train', categories=categories,\n",
    "                                shuffle=True, random_state=42,\n",
    "                                remove=remove)\n",
    "\n",
    "data_test = fetch_20newsgroups(subset='test', categories=categories,\n",
    "                               shuffle=True, random_state=42,\n",
    "                               remove=remove)\n",
    "print('data loaded')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[\"From: rych@festival.ed.ac.uk (R Hawkes)\\nSubject: 3DS: Where did all the texture rules go?\\nLines: 21\\n\\nHi,\\n\\nI've noticed that if you only save a model (with all your mapping planes\\npositioned carefully) to a .3DS file that when you reload it after restarting\\n3DS, they are given a default position and orientation.  But if you save\\nto a .PRJ file their positions/orientation are preserved.  Does anyone\\nknow why this information is not stored in the .3DS file?  Nothing is\\nexplicitly said in the manual about saving texture rules in the .PRJ file. \\nI'd like to be able to read the texture rule information, does anyone have \\nthe format for the .PRJ file?\\n\\nIs the .CEL file format available from somewhere?\\n\\nRych\\n\\n======================================================================\\nRycharde Hawkes\\t\\t\\t\\temail: rych@festival.ed.ac.uk\\nVirtual Environment Laboratory\\nDept. of Psychology\\t\\t\\tTel  : +44 31 650 3426\\nUniv. of Edinburgh\\t\\t\\tFax  : +44 31 667 0150\\n======================================================================\\n\", \"Subject: Re: Biblical Backing of Koresh's 3-02 Tape (Cites enclosed)\\nFrom: kmcvay@oneb.almanac.bc.ca (Ken Mcvay)\\nOrganization: The Old Frog's Almanac\\nLines: 20\\n\\nIn article <20APR199301460499@utarlg.uta.edu> b645zaw@utarlg.uta.edu (stephen) writes:\\n\\n>Seems to me Koresh is yet another messenger that got killed\\n>for the message he carried. (Which says nothing about the \\n\\nSeems to be, barring evidence to the contrary, that Koresh was simply\\nanother deranged fanatic who thought it neccessary to take a whole bunch of\\nfolks with him, children and all, to satisfy his delusional mania. Jim\\nJones, circa 1993.\\n\\n>In the mean time, we sure learned a lot about evil and corruption.\\n>Are you surprised things have gotten that rotten?\\n\\nNope - fruitcakes like Koresh have been demonstrating such evil corruption\\nfor centuries.\\n-- \\nThe Old Frog's Almanac - A Salute to That Old Frog Hisse'f, Ryugen Fisher \\n     (604) 245-3205 (v32) (604) 245-4366 (2400x4) SCO XENIX 2.3.2 GT \\n  Ladysmith, British Columbia, CANADA. Serving Central Vancouver Island  \\nwith public access UseNet and Internet Mail - home to the Holocaust Almanac\\n\"]\n",
      "2034 documents - 3.980MB (training set)\n",
      "1353 documents - 2.867MB (test set)\n",
      "4 categories\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# order of labels in `target_names` can be different from `categories`\n",
    "target_names = data_train.target_names\n",
    "\n",
    "def size_mb(docs):\n",
    "    return sum(len(s.encode('utf-8')) for s in docs) / 1e6\n",
    "\n",
    "#　list\n",
    "print(data_train.data[0:2])\n",
    "data_train_size_mb = size_mb(data_train.data)\n",
    "data_test_size_mb = size_mb(data_test.data)\n",
    "\n",
    "print(\"%d documents - %0.3fMB (training set)\" % (\n",
    "    len(data_train.data), data_train_size_mb))\n",
    "print(\"%d documents - %0.3fMB (test set)\" % (\n",
    "    len(data_test.data), data_test_size_mb))\n",
    "print(\"%d categories\" % len(categories))\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting features from the training data using a sparse vectorizer\n"
     ]
    }
   ],
   "source": [
    "y_train, y_test = data_train.target, data_test.target # 分类\n",
    "print(\"Extracting features from the training data using a sparse vectorizer\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "using TfidfVectorizer...\n",
      "done in 1.610643s at 2.471MB/s\n",
      "n_samples: 2034, n_features: 33809\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\sklearn\\feature_extraction\\text.py:1059: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.float):\n"
     ]
    }
   ],
   "source": [
    "t0 = time()\n",
    "if opts.use_hashing:\n",
    "    print('use hashing...')\n",
    "    vectorizer = HashingVectorizer(stop_words='english', alternate_sign=False,\n",
    "                                   n_features=opts.n_features)\n",
    "    X_train = vectorizer.transform(data_train.data)\n",
    "else:\n",
    "    print('using TfidfVectorizer...')\n",
    "    vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,\n",
    "                                 stop_words='english')\n",
    "    X_train = vectorizer.fit_transform(data_train.data)\n",
    "duration = time() - t0\n",
    "print(\"done in %fs at %0.3fMB/s\" % (duration, data_train_size_mb / duration))\n",
    "print(\"n_samples: %d, n_features: %d\" % X_train.shape)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting features from the test data using the same vectorizer\n",
      "done in 1.111289s at 2.580MB/s\n",
      "n_samples: 1353, n_features: 33809\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\sklearn\\feature_extraction\\text.py:1059: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.float):\n"
     ]
    }
   ],
   "source": [
    "print(\"Extracting features from the test data using the same vectorizer\")\n",
    "t0 = time()\n",
    "X_test = vectorizer.transform(data_test.data)\n",
    "duration = time() - t0\n",
    "print(\"done in %fs at %0.3fMB/s\" % (duration, data_test_size_mb / duration))\n",
    "print(\"n_samples: %d, n_features: %d\" % X_test.shape)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['00', '000', '0000', '00000', '000000', '000005102000', '000021', '000062david42', '0000vec', '0001']\n"
     ]
    }
   ],
   "source": [
    "# mapping from integer feature name to original token string\n",
    "if opts.use_hashing:\n",
    "    feature_names = None\n",
    "else:\n",
    "    feature_names = vectorizer.get_feature_names()\n",
    "\n",
    "print(feature_names[0:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 特征筛选\n",
    "if opts.select_chi2:\n",
    "    print(\"Extracting %d best features by a chi-squared test\" %\n",
    "          opts.select_chi2)\n",
    "    t0 = time()\n",
    "    ch2 = SelectKBest(chi2, k=opts.select_chi2)\n",
    "    X_train = ch2.fit_transform(X_train, y_train)\n",
    "    X_test = ch2.transform(X_test)\n",
    "    if feature_names:\n",
    "        # keep selected feature names\n",
    "        feature_names = [feature_names[i] for i\n",
    "                         in ch2.get_support(indices=True)]\n",
    "    print(\"done in %fs\" % (time() - t0))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['00' '000' '0000' '00000' '000000' '000005102000' '000021'\n",
      " '000062david42' '0000vec' '0001']\n"
     ]
    }
   ],
   "source": [
    "if feature_names:\n",
    "    feature_names = np.asarray(feature_names)\n",
    "    \n",
    "print(feature_names[0:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 过滤太长的内容\n",
    "def trim(s):\n",
    "    \"\"\"Trim string to fit on terminal (assuming 80-column display)\"\"\"\n",
    "    return s if len(s) <= 80 else s[:77] + \"...\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def benchmark(clf):\n",
    "    print('_' * 80)\n",
    "    print(\"Training: \")\n",
    "    print(clf)\n",
    "    t0 = time()\n",
    "    clf.fit(X_train, y_train)\n",
    "    train_time = time() - t0\n",
    "    print(\"train time: %0.3fs\" % train_time)\n",
    "    \n",
    "    t0 = time()\n",
    "    pred = clf.predict(X_test)\n",
    "    test_time = time() - t0\n",
    "    print(\"test time:  %0.3fs\" % test_time)\n",
    "    \n",
    "    score = metrics.accuracy_score(y_test, pred)\n",
    "    print(\"accuracy:   %0.3f\" % score)\n",
    "    \n",
    "    if hasattr(clf, 'coef_'):\n",
    "        print(\"dimensionality: %d\" % clf.coef_.shape[1])\n",
    "        print(\"density: %f\" % density(clf.coef_))\n",
    "        \n",
    "        # 利用这里的top10 的特征 作为关键词\n",
    "        if opts.print_top10 and feature_names is not None:\n",
    "            print(\"top 10 keywords per class:\")\n",
    "            for i, label in enumerate(target_names):\n",
    "                top10 = np.argsort(clf.coef_[i])[-10:]\n",
    "                print(trim(\"%s: %s\" % (label, \" \".join(feature_names[top10]))))\n",
    "        print()\n",
    "    \n",
    "    if opts.print_report:\n",
    "        print(\"classification report:\")\n",
    "        print(metrics.classification_report(y_test, pred,\n",
    "                                            target_names=target_names))\n",
    "        \n",
    "    if opts.print_cm:\n",
    "        print(\"confusion matrix:\")\n",
    "        print(metrics.confusion_matrix(y_test, pred))\n",
    "\n",
    "    print()\n",
    "    clf_descr = str(clf).split('(')[0]\n",
    "    return clf_descr, score, train_time, test_time\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "Ridge Classifier\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "RidgeClassifier(alpha=1.0, class_weight=None, copy_X=True, fit_intercept=True,\n",
      "        max_iter=None, normalize=False, random_state=None, solver='lsqr',\n",
      "        tol=0.01)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\sklearn\\linear_model\\ridge.py:311: UserWarning: In Ridge, only 'sag' solver can currently fit the intercept when X is sparse. Solver has been automatically changed into 'sag'.\n",
      "  warnings.warn(\"In Ridge, only 'sag' solver can currently fit the \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train time: 0.775s\n",
      "test time:  0.006s\n",
      "accuracy:   0.897\n",
      "dimensionality: 33809\n",
      "density: 1.000000\n",
      "top 10 keywords per class:\n",
      "alt.atheism: atheist osrhe wingate god okcforum caltech islamic atheism keith...\n",
      "comp.graphics: animation video looking card hi 3d thanks file image graphics\n",
      "sci.space: flight dc shuttle launch pat moon sci orbit nasa space\n",
      "talk.religion.misc: jesus mitre hudson morality 2000 biblical beast mr fbi ch...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.87      0.83      0.85       319\n",
      "     comp.graphics       0.90      0.98      0.94       389\n",
      "         sci.space       0.96      0.94      0.95       394\n",
      "talk.religion.misc       0.83      0.78      0.80       251\n",
      "\n",
      "       avg / total       0.90      0.90      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[266  10   7  36]\n",
      " [  1 381   4   3]\n",
      " [  0  22 372   0]\n",
      " [ 40  10   6 195]]\n",
      "\n",
      "================================================================================\n",
      "Perceptron\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "Perceptron(alpha=0.0001, class_weight=None, eta0=1.0, fit_intercept=True,\n",
      "      n_iter=50, n_jobs=1, penalty=None, random_state=0, shuffle=True,\n",
      "      verbose=0, warm_start=False)\n",
      "train time: 0.320s\n",
      "test time:  0.005s\n",
      "accuracy:   0.885\n",
      "dimensionality: 33809\n",
      "density: 0.240165\n",
      "top 10 keywords per class:\n",
      "alt.atheism: mantis example religion okcforum rice religious thing keith athe...\n",
      "comp.graphics: bates albany jr0930 pov video windows package imagine file gra...\n",
      "sci.space: observations solar comet planets astro moon sci funding orbit space\n",
      "talk.religion.misc: loving told mr stephen 2000 frank fbi buffalo abortion ch...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.85      0.81      0.83       319\n",
      "     comp.graphics       0.91      0.96      0.94       389\n",
      "         sci.space       0.93      0.94      0.94       394\n",
      "talk.religion.misc       0.80      0.77      0.79       251\n",
      "\n",
      "       avg / total       0.88      0.89      0.88      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[259   8   9  43]\n",
      " [  4 373   9   3]\n",
      " [  5  15 372   2]\n",
      " [ 36  12   9 194]]\n",
      "\n",
      "================================================================================\n",
      "Passive-Aggressive\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "PassiveAggressiveClassifier(C=1.0, class_weight=None, fit_intercept=True,\n",
      "              loss='hinge', n_iter=50, n_jobs=1, random_state=None,\n",
      "              shuffle=True, verbose=0, warm_start=False)\n",
      "train time: 0.459s\n",
      "test time:  0.005s\n",
      "accuracy:   0.905\n",
      "dimensionality: 33809\n",
      "density: 0.687384\n",
      "top 10 keywords per class:\n",
      "alt.atheism: wingate cobb rushdie caltech osrhe okcforum islamic keith atheis...\n",
      "comp.graphics: 42 files card video code file animation 3d image graphics\n",
      "sci.space: alaska pat launch shuttle dc sci nasa moon orbit space\n",
      "talk.religion.misc: 666 biblical abortion mr beast 2000 hudson morality fbi c...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.88      0.84      0.86       319\n",
      "     comp.graphics       0.93      0.98      0.95       389\n",
      "         sci.space       0.95      0.96      0.95       394\n",
      "talk.religion.misc       0.83      0.80      0.81       251\n",
      "\n",
      "       avg / total       0.90      0.91      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[267   5   9  38]\n",
      " [  1 380   4   4]\n",
      " [  1  15 378   0]\n",
      " [ 36   8   7 200]]\n",
      "\n",
      "================================================================================\n",
      "kNN\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
      "           metric_params=None, n_jobs=1, n_neighbors=10, p=2,\n",
      "           weights='uniform')\n",
      "train time: 0.004s\n",
      "test time:  0.439s\n",
      "accuracy:   0.858\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.78      0.90      0.84       319\n",
      "     comp.graphics       0.89      0.89      0.89       389\n",
      "         sci.space       0.90      0.91      0.90       394\n",
      "talk.religion.misc       0.86      0.67      0.75       251\n",
      "\n",
      "       avg / total       0.86      0.86      0.86      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[287   3  11  18]\n",
      " [ 14 348  19   8]\n",
      " [  7  26 359   2]\n",
      " [ 59  13  12 167]]\n",
      "\n",
      "================================================================================\n",
      "Random forest\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
      "            max_depth=None, max_features='auto', max_leaf_nodes=None,\n",
      "            min_impurity_split=1e-07, min_samples_leaf=1,\n",
      "            min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
      "            n_estimators=100, n_jobs=1, oob_score=False, random_state=None,\n",
      "            verbose=0, warm_start=False)\n",
      "train time: 11.306s\n",
      "test time:  0.278s\n",
      "accuracy:   0.836\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.84      0.74      0.79       319\n",
      "     comp.graphics       0.78      0.96      0.86       389\n",
      "         sci.space       0.92      0.89      0.90       394\n",
      "talk.religion.misc       0.80      0.69      0.74       251\n",
      "\n",
      "       avg / total       0.84      0.84      0.83      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[236  31  10  42]\n",
      " [  4 374  10   1]\n",
      " [  2  42 349   1]\n",
      " [ 38  30  11 172]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "opts.print_top10 = True\n",
    "opts.print_report = True\n",
    "opts.print_cm = True\n",
    "\n",
    "results = []\n",
    "for clf, name in (\n",
    "        (RidgeClassifier(tol=1e-2, solver=\"lsqr\"), \"Ridge Classifier\"),\n",
    "        (Perceptron(n_iter=50), \"Perceptron\"),\n",
    "        (PassiveAggressiveClassifier(n_iter=50), \"Passive-Aggressive\"),\n",
    "        (KNeighborsClassifier(n_neighbors=10), \"kNN\"),\n",
    "        (RandomForestClassifier(n_estimators=100), \"Random forest\")):\n",
    "    print('=' * 80)\n",
    "    print(name)\n",
    "    results.append(benchmark(clf))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "L2 penalty\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.001,\n",
      "     verbose=0)\n",
      "train time: 0.455s\n",
      "test time:  0.009s\n",
      "accuracy:   0.900\n",
      "dimensionality: 33809\n",
      "density: 1.000000\n",
      "top 10 keywords per class:\n",
      "alt.atheism: rushdie osrhe atheist wingate okcforum caltech islamic atheism k...\n",
      "comp.graphics: code 42 video hi animation thanks 3d file image graphics\n",
      "sci.space: planets dc pat shuttle launch sci moon nasa orbit space\n",
      "talk.religion.misc: abortion hudson 666 biblical 2000 morality mr beast fbi c...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.87      0.83      0.85       319\n",
      "     comp.graphics       0.91      0.98      0.95       389\n",
      "         sci.space       0.96      0.95      0.95       394\n",
      "talk.religion.misc       0.83      0.79      0.81       251\n",
      "\n",
      "       avg / total       0.90      0.90      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[266   7   8  38]\n",
      " [  2 381   3   3]\n",
      " [  1  20 373   0]\n",
      " [ 38   9   6 198]]\n",
      "\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
      "       eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
      "       learning_rate='optimal', loss='hinge', n_iter=50, n_jobs=1,\n",
      "       penalty='l2', power_t=0.5, random_state=None, shuffle=True,\n",
      "       verbose=0, warm_start=False)\n",
      "train time: 0.426s\n",
      "test time:  0.006s\n",
      "accuracy:   0.902\n",
      "dimensionality: 33809\n",
      "density: 0.664313\n",
      "top 10 keywords per class:\n",
      "alt.atheism: osrhe atheist okcforum cobb caltech wingate islamic keith atheis...\n",
      "comp.graphics: code video 3do 42 hi 3d animation file image graphics\n",
      "sci.space: pat shuttle planets launch sci dc moon nasa orbit space\n",
      "talk.religion.misc: frank abortion 666 biblical mr fbi morality beast 2000 ch...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.87      0.84      0.85       319\n",
      "     comp.graphics       0.92      0.97      0.94       389\n",
      "         sci.space       0.96      0.95      0.95       394\n",
      "talk.religion.misc       0.83      0.80      0.82       251\n",
      "\n",
      "       avg / total       0.90      0.90      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[267   7   8  37]\n",
      " [  2 378   4   5]\n",
      " [  1  19 374   0]\n",
      " [ 36   8   5 202]]\n",
      "\n",
      "================================================================================\n",
      "L1 penalty\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l1', random_state=None, tol=0.001,\n",
      "     verbose=0)\n",
      "train time: 0.801s\n",
      "test time:  0.004s\n",
      "accuracy:   0.873\n",
      "dimensionality: 33809\n",
      "density: 0.005538\n",
      "top 10 keywords per class:\n",
      "alt.atheism: benedikt rice rushdie wingate islamic bmd atheism wwc keith athe...\n",
      "comp.graphics: sphere virtual 42 files windows hi image 3d 3do graphics\n",
      "sci.space: pat henry sunrise rockets dc launch flight moon orbit space\n",
      "talk.religion.misc: hudson thyagi biblical 2000 abortion kendig hare mitre ch...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.85      0.75      0.80       319\n",
      "     comp.graphics       0.89      0.97      0.93       389\n",
      "         sci.space       0.94      0.94      0.94       394\n",
      "talk.religion.misc       0.76      0.78      0.77       251\n",
      "\n",
      "       avg / total       0.87      0.87      0.87      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[238  14  11  56]\n",
      " [  0 378   7   4]\n",
      " [  2  22 369   1]\n",
      " [ 39  12   4 196]]\n",
      "\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
      "       eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
      "       learning_rate='optimal', loss='hinge', n_iter=50, n_jobs=1,\n",
      "       penalty='l1', power_t=0.5, random_state=None, shuffle=True,\n",
      "       verbose=0, warm_start=False)\n",
      "train time: 1.313s\n",
      "test time:  0.006s\n",
      "accuracy:   0.891\n",
      "dimensionality: 33809\n",
      "density: 0.020409\n",
      "top 10 keywords per class:\n",
      "alt.atheism: wwc rice psilink charley rushdie wingate keith atheism islamic a...\n",
      "comp.graphics: windows card files animation color hi file image 3do graphics\n",
      "sci.space: sunrise sci rockets nasa flight moon launch dc orbit space\n",
      "talk.religion.misc: biblical christ 666 beast 2000 homosexuality mr abortion ...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.86      0.79      0.82       319\n",
      "     comp.graphics       0.93      0.97      0.95       389\n",
      "         sci.space       0.95      0.95      0.95       394\n",
      "talk.religion.misc       0.78      0.81      0.79       251\n",
      "\n",
      "       avg / total       0.89      0.89      0.89      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[252   6  11  50]\n",
      " [  3 376   6   4]\n",
      " [  2  15 374   3]\n",
      " [ 37   8   3 203]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for penalty in [\"l2\", \"l1\"]:\n",
    "    print('=' * 80)\n",
    "    print(\"%s penalty\" % penalty.upper())\n",
    "    # Train Liblinear model\n",
    "    results.append(benchmark(LinearSVC(penalty=penalty, dual=False,\n",
    "                                       tol=1e-3)))\n",
    "\n",
    "    # Train SGD model\n",
    "    results.append(benchmark(SGDClassifier(alpha=.0001, n_iter=50,\n",
    "                                           penalty=penalty)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "Elastic-Net penalty\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
      "       eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
      "       learning_rate='optimal', loss='hinge', n_iter=50, n_jobs=1,\n",
      "       penalty='elasticnet', power_t=0.5, random_state=None, shuffle=True,\n",
      "       verbose=0, warm_start=False)\n",
      "train time: 1.349s\n",
      "test time:  0.005s\n",
      "accuracy:   0.899\n",
      "dimensionality: 33809\n",
      "density: 0.187406\n",
      "top 10 keywords per class:\n",
      "alt.atheism: atheist rushdie caltech charley cobb wingate islamic keith athei...\n",
      "comp.graphics: computer points 42 hi 3do 3d file animation image graphics\n",
      "sci.space: rockets shuttle planets launch sci dc nasa moon orbit space\n",
      "talk.religion.misc: homosexuality abortion 666 biblical morality mr 2000 fbi ...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.87      0.83      0.85       319\n",
      "     comp.graphics       0.92      0.98      0.95       389\n",
      "         sci.space       0.95      0.94      0.95       394\n",
      "talk.religion.misc       0.82      0.79      0.81       251\n",
      "\n",
      "       avg / total       0.90      0.90      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[266   7   8  38]\n",
      " [  0 380   4   5]\n",
      " [  2  19 372   1]\n",
      " [ 39   7   6 199]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('=' * 80)\n",
    "print(\"Elastic-Net penalty\")\n",
    "results.append(benchmark(SGDClassifier(alpha=.0001, n_iter=50,\n",
    "                                       penalty=\"elasticnet\")))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "NearestCentroid (aka Rocchio classifier)\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "NearestCentroid(metric='euclidean', shrink_threshold=None)\n",
      "train time: 0.053s\n",
      "test time:  0.009s\n",
      "accuracy:   0.855\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.88      0.69      0.77       319\n",
      "     comp.graphics       0.84      0.97      0.90       389\n",
      "         sci.space       0.96      0.92      0.94       394\n",
      "talk.religion.misc       0.72      0.79      0.75       251\n",
      "\n",
      "       avg / total       0.86      0.86      0.85      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[219  25   5  70]\n",
      " [  1 379   5   4]\n",
      " [  1  30 361   2]\n",
      " [ 29  19   5 198]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Train NearestCentroid without threshold\n",
    "print('=' * 80)\n",
    "print(\"NearestCentroid (aka Rocchio classifier)\")\n",
    "results.append(benchmark(NearestCentroid()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "Naive Bayes\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)\n",
      "train time: 0.018s\n",
      "test time:  0.006s\n",
      "accuracy:   0.899\n",
      "dimensionality: 33809\n",
      "density: 1.000000\n",
      "top 10 keywords per class:\n",
      "alt.atheism: say livesey article don people atheists com caltech god keith\n",
      "comp.graphics: file image com files nntp host posting thanks university graphics\n",
      "sci.space: pat moon digex henry article access gov com nasa space\n",
      "talk.religion.misc: apple don kent article people sandvik jesus christian god...\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.85      0.87      0.86       319\n",
      "     comp.graphics       0.95      0.95      0.95       389\n",
      "         sci.space       0.92      0.95      0.94       394\n",
      "talk.religion.misc       0.86      0.77      0.81       251\n",
      "\n",
      "       avg / total       0.90      0.90      0.90      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[279   2   8  30]\n",
      " [  2 369  16   2]\n",
      " [  3  15 376   0]\n",
      " [ 45   4   9 193]]\n",
      "\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "BernoulliNB(alpha=0.01, binarize=0.0, class_prior=None, fit_prior=True)\n",
      "train time: 0.035s\n",
      "test time:  0.019s\n",
      "accuracy:   0.884\n",
      "dimensionality: 33809\n",
      "density: 1.000000\n",
      "top 10 keywords per class:\n",
      "alt.atheism: god say think people don com nntp host posting article\n",
      "comp.graphics: like com article know thanks graphics university nntp host pos...\n",
      "sci.space: nasa like university just com nntp host posting space article\n",
      "talk.religion.misc: think know christian posting god people just don article com\n",
      "\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.83      0.88      0.86       319\n",
      "     comp.graphics       0.88      0.96      0.92       389\n",
      "         sci.space       0.94      0.91      0.92       394\n",
      "talk.religion.misc       0.87      0.73      0.79       251\n",
      "\n",
      "       avg / total       0.88      0.88      0.88      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[282   9   3  25]\n",
      " [  1 373  13   2]\n",
      " [  5  31 358   0]\n",
      " [ 50  10   8 183]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Train sparse Naive Bayes classifiers\n",
    "print('=' * 80)\n",
    "print(\"Naive Bayes\")\n",
    "results.append(benchmark(MultinomialNB(alpha=.01)))\n",
    "results.append(benchmark(BernoulliNB(alpha=.01)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "================================================================================\n",
      "LinearSVC with L1-based feature selection\n",
      "________________________________________________________________________________\n",
      "Training: \n",
      "Pipeline(steps=[('feature_selection', SelectFromModel(estimator=LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l1', random_state=None, tol=0.001,\n",
      "     verbose=0),\n",
      "        prefit=False, thresho...ax_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0))])\n",
      "train time: 1.022s\n",
      "test time:  0.011s\n",
      "accuracy:   0.880\n",
      "classification report:\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "       alt.atheism       0.84      0.80      0.82       319\n",
      "     comp.graphics       0.91      0.96      0.93       389\n",
      "         sci.space       0.93      0.95      0.94       394\n",
      "talk.religion.misc       0.81      0.76      0.78       251\n",
      "\n",
      "       avg / total       0.88      0.88      0.88      1353\n",
      "\n",
      "confusion matrix:\n",
      "[[254  11  13  41]\n",
      " [  2 374   9   4]\n",
      " [  2  18 373   1]\n",
      " [ 44   9   8 190]]\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\sklearn\\utils\\__init__.py:54: FutureWarning: Conversion of the second argument of issubdtype from `int` to `np.signedinteger` is deprecated. In future, it will be treated as `np.int32 == np.dtype(int).type`.\n",
      "  if np.issubdtype(mask.dtype, np.int):\n"
     ]
    }
   ],
   "source": [
    "print('=' * 80)\n",
    "print(\"LinearSVC with L1-based feature selection\")\n",
    "# The smaller C, the stronger the regularization.\n",
    "# The more regularization, the more sparsity.\n",
    "results.append(benchmark(Pipeline([\n",
    "  ('feature_selection', SelectFromModel(LinearSVC(penalty=\"l1\", dual=False,\n",
    "                                                  tol=1e-3))),\n",
    "  ('classification', LinearSVC(penalty=\"l2\"))])))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n/vHHHzNz5kx23333ZbZRyvtSim222QbIb725rF0p1iRr3mafklZKY2Mj2Wy23GVIkiRVpFwuR0ND\nQ7nLWCXWW289IL8uQkcLNXakW7duRAQfffRRW6gwc+ZM7r777lVW54rYa6+96NmzJz/5yU844YQT\n2qZkNDY2Ltf0Csi/L2+9teo3D+zVqxf77LMPN998M6eeeiqbb775Iuebm5vJZDKrvI4VZaggVZhs\nNkt9fX25y5AkSdJaZsCAAaSUOO+88zjqqKPo3r07hxxySIfTHlr953/+J9deey0HHnggw4YN4/XX\nX+fHP/4x2223HU8//fQy+1zSNIXOmr7QvXt3LrroIk4//XT23XdfjjzySGbOnMm4cePYdtttl2sU\nwoABA3jwwQcZPXo0W2yxBf369VtkIcbO9KMf/YjBgwez6667ctJJJ7HNNtvw+uuv89hjj/Hyyy/z\n5JNPrpJ+V8YqCxVSSiOBkauqfUmSJEla4yzHjgVrav977bUXl156KTfddBP3338/LS0tzJgxg7q6\nOiKiww/g++67L2PHjuWKK67gjDPOoF+/flx11VXMmDFjsVChozaW9KG+o+Ol3vvNb+aX9fvBD37A\nWWedxe67784999zDaaedRnV1dYdtFLv22msZPnw4F1xwAfPnz+e4445bYqiwpPdpeY9ns1meeOIJ\nRo4cyW233cacOXPYdNNN2XPPPRkxYsQyay2HKOcCFpI6T0TUA5MnT57sSAVJkqRVZMqUKQwYMID2\n/+Zqampih2yWBfPmlbG6vOraWqblcss9haErSinRq1cvDj/8cG6+eYlLAK5VlvS72f48MCCltOz9\nPpeT0x8kSZIkaSXV1dUxLZejubn8u0NkMhkDhSILFy5k3XXXXeTYbbfdxptvvsm+++5bpqoqh6GC\nJEmSJHWCuro6P8yvgR5//HHOOOMMhg4dSs+ePZk8eTJjx45lt91244gjjih3eWs9QwVJkiRJUsXq\n27cvdXV13Hjjjbz55ptssskmHH/88Vx++eWLbIOp0vgOSpIkSZIqVp8+ffjd735X7jIqlqGCVGFy\nuVxZ+3cOnyRJktR1GCpIFaahoaGs/dfWVJObOs1gQZIkSeoCDBWkCnPJQXDwjuXpOzcbGu5YQHNz\ns6GCJEmS1AUYKkgVpt8mUL9VuauQJEmS1BVUlbsASZIkSZK0djJUkCRJkiRJJTFUkCRJkiRJJTFU\nkCRJkiRJJXGhRkmSJEnqBE1NTTQ3N5e7DDKZTJfYiev444/nkUceYcaMGeUupUszVJAkSZKkldTU\n1ER2xx2YN39BuUuhtqaa3NRpKxwsPPbYY0ycOJEzzjiDDTbYYBVVB5dffjk77bQTQ4YMWea1r776\nKrfccgtf/vKX2W233RY5FxFUVTn4vtwMFaQKM+NNmPJSefrOzS5Pv5IkSeXW3NzMvPkLaBwG2U3L\nV0duNjTcsYDm5uYVDhUeffRRLr74Yk444YRVGiqMGjWKoUOHLleo8MorrzBy5Ej69eu3WKjw05/+\nlJaWllVVppaToYJUYS6YkP8ql9qaajKZTPkKkCRJKqPsplC/VbmrKE1KqdwlLGZpNXXr1o1u3bqt\nxmrUEUMFqcI0NjaSzWbL1n9XmcMnSZJUSUaOHMnIkSOJCPr27QvkpxfMmDGj7d92jY2NXHfddTz7\n7LPU1NRwwAEHcPXVV7PVVv9OUaZPn87ZZ5/No48+yltvvUUmk2HQoEHccsstrL/++lRVVRERjBs3\njnHjxgH5tRHGjh27WE2PPPII++67LxHB8ccfz/HHH09EcOutt3LssccutqbCrFmz6NevH9dccw3V\n1dX84Ac/4LXXXmPQoEGMHTuWLbfckksuuYRbbrmFOXPmcMABBzBu3Dg22mijRfr94x//yOWXX86U\nKVOoqqpi77335qqrrmKnnXZaBe/82s9QQaow2WyW+vr6cpchSZKktcjhhx/Oc889x5133sn1119P\nz549AejVqxcAl112GRdeeCFHHXUUJ510Em+88QY33HADn/vc53jyySfZYIMN+PDDDznggAP48MMP\nOf3009l88815+eWXuffee3nrrbdYf/31aWxs5Gtf+xoDBw7k5JNPBqB///4d1pTNZrn44ou58MIL\nGT58OIMHDwbgs5/9LJAPPSJisfsaGxvbanjzzTe58sorGTp0KPvttx+PPPII55xzDtOnT+eGG27g\nu9/9Lj/96U/b7v3FL37B8ccfz0EHHcRVV13FvHnzGDNmDIMHD+bJJ5/0j2cdMFSQJEmSpC5ul112\nob6+njvvvJMhQ4Ys8uG5qamJiy66iFGjRnH22We3HT/ssMPYY489+PGPf8w555zDs88+y8yZM/nt\nb3/Ll7/85bbrzj///Lafhw0bxvDhw9lmm20YNmzYUmvadNNN+eIXv8iFF17IZz7zmWVe3+qVV15h\n+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\n6XQMFDSvDBWkIdPtdhkdHR10GZIkSZKWgYV4jKMkSZIkSVoGDBUkSZIkSVJfDBUkSZIkSVJfDBUk\nSZIkSVJfDBUkSZIkSVJfDBUkSZIkSVJffKSkNGQmJycHXYIkSZKkJWahviekqhbkwpIWV5JR4OJB\n1yFJkiRpSVtTVRPzdTFnKkhD5vWHwxEHDroKSZIkSUvJJy+Dk9fO/3UNFaQhs8/uMHq/QVchSZIk\naSmZ3Lww13WjRkmSJEmS1BdDBUmSJEmS1BdDBUmSJEmS1BdDBUmSJEmS1BdDBUmSJEmS1BdDBUmS\nJEmS1BcfKSkNmQ3XwsQPBl2FJEmSpKVkw7ULc91U1cJcWdKiSjIKXDzoOiRJkiQtaWuqamK+LuZM\nBWnIjI+P0+12B12GJEmSpCVkcnKSsbGxeb+uoYI0ZLrdLqOjo4MuQ5IkSdIy4EaNkiRJkiSpL4YK\nkiRJkiSpL4YK0pD54Q9/OOgSJEmSJC0ThgrSkJmamhp0CZIkSZKWCUMFSZIkSZLUF0MFSZIkSZLU\nF0MFSZIkSZLUF0MFSZIkSZLUF0MFSZIkSZLUF0MFSZIkSZLUF0MFSZIkSZLUF0MFSZIkSZLUF0MF\nSZIkSZLUF0MFach0Op1BlyBJkiRpmTBUkIbMHnvsMegSJEmSJC0ThgqSJEmSJKkvhgqSJEmSJKkv\nOw26AEnza3JyctAlSJIkaYh1Oh1GRkYGXYaWiCUbKiTZAPx9Vf3DdvbfG9gAPLSqvrWVPscAb62q\ne81fpfNnMetL8j7gnlX1Bz3H3gM8HdgNeBjwNuCSqnrpQtej+TM2NjboEiRJkjTEVqxYybp1lxks\nCJhjqLCVL6LPAD4I/C/gYOAY4KSqOq2nz1OAj1bVXJZbHALcOJf6gJqnPgsiyWOBvwQOBVbShCBr\ngbdU1dVtt8Wq7wQgPbUdDjwHOKytawp4GvCzRapH8+axwP6DLkKSJElDaYpbbvkIU1NThgoCdnCm\nQpLnAm8Hnl9VH2hDh5uBVyR5d1X9pKf7nL4sV9WP+impj3N2WJKdqurn2+jzfOAdwPuAPwCuBEZo\nvsi/lCZsWDRVtWXGof2ATVX1lZ5jP96RMZLcrRmqBhbkLE/3Au476CIkSZIkLQN9b9SY5OU00+OP\nqqoP9DSdD1xDM3Phzs5/dJKLktyUZGOStyVZ1dO+IckJPe8flOT/Jrk5ybeTPD7J7UmOnHHpfZP8\n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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1fa45d415f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "indices = np.arange(len(results))\n",
    "\n",
    "results = [[x[i] for x in results] for i in range(4)]\n",
    "\n",
    "clf_names, score, training_time, test_time = results\n",
    "training_time = np.array(training_time) / np.max(training_time)\n",
    "test_time = np.array(test_time) / np.max(test_time)\n",
    "\n",
    "plt.figure(figsize=(12, 8))\n",
    "plt.title(\"Score\")\n",
    "plt.barh(indices, score, .2, label=\"score\", color='navy')\n",
    "plt.barh(indices + .3, training_time, .2, label=\"training time\",\n",
    "         color='c')\n",
    "plt.barh(indices + .6, test_time, .2, label=\"test time\", color='darkorange')\n",
    "plt.yticks(())\n",
    "plt.legend(loc='best')\n",
    "plt.subplots_adjust(left=.25)\n",
    "plt.subplots_adjust(top=.95)\n",
    "plt.subplots_adjust(bottom=.05)\n",
    "\n",
    "for i, c in zip(indices, clf_names):\n",
    "    plt.text(-.3, i, c)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
